#include <iostream>
#include "shm.hpp"
#include "namepipe.hpp"

int main()
{
    // 创建共享内存类
    shm mem(shmspace::gPathname, shmspace::gProjid, shmspace::gShmSize, shmspace::gCreat);

    // 创建命名管道，用于共享内存之间的同步，当写端不进行写入时，读端会一直阻塞等待，
    // 这样可以避免共享内存由于没有同步机制而导致的数据不一致问题
    namepipe fifo(pipespace::gpathname, pipespace::gCreat);

    fifo.OpenPipeRead(); // 管道打开读端

    char *add = (char *)mem.GetShmAddr(); // 获取共享内存
    std::string tmp;
    while (true)
    {
        // 若读到数据代表写端共享内存已经准备好数据了，可以进行共享内存的读取
        if (fifo.GetMassage(&tmp))                            
            std::cout << " server get :" << add << std::endl; // 读取共享内存的数据

        if (1 == mem.GetShmNattch()) // 判断共享内存的挂载数，如果是1 代表写端已经退出，读端也可以退出
        {
            std::cout << "client quit! server quit too !" << std::endl;
            break;
        }
    }
    return 0;
}